package com.arsenavid.aterrizacomopuedas.model;

import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;

import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

@Entity
@Table(name="vuelos")
@NamedQueries({
		
	@NamedQuery(name="vuelosPorNombreOrigenNombreDestinoDia", query="select v "
					+"from Vuelo as v "
					+"where v.aeropuertoOrigen.codIATA = :origen "
					+"	and v.aeropuertoDestino.codIATA = :destino "
					+"	and v.horaSalida >= :dia "
					+"	and v.horaSalida < :diaPosterior")
	
})
public class Vuelo implements Serializable{
	
	private static final long serialVersionUID = 1L;
	
	//marca la identidad entre la maquina virtual y la base de datos
	@Id
	@GeneratedValue(strategy=GenerationType.TABLE)
	private int id;
	
	/*Desde un aeropuerto pueden llegar varios vuelos (MANY)
	  Desde un vuelo puede ir a un Aeropuerto (ONE)
	  (fetch=FetchType.EAGER) --> cargados en cache de 2 level
	  (fetch=FetchType.LAZY) --> carga el objeto cuando lo necesita
	  */
	@ManyToOne(fetch=FetchType.EAGER)
	private Aeropuerto aeropuertoOrigen;
	@ManyToOne(fetch=FetchType.EAGER)
	private Aeropuerto aeropuertoDestino;
	@Temporal(TemporalType.TIMESTAMP)
	private Date horaSalida;
	@Temporal(TemporalType.TIMESTAMP)
	private Date horaLlegada;
	private BigDecimal precio;
	private int plazas;
	private int plazasLibres;
	
	public Vuelo(){}
	
	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}
	
	public Aeropuerto getAeropuertoDestino() {
		return aeropuertoDestino;
	}
	
	public Aeropuerto getAeropuertoOrigen() {
		return aeropuertoOrigen;
	}
	
	public void setAeropuertoDestino(Aeropuerto aeropuertoDestino) {
		this.aeropuertoDestino = aeropuertoDestino;
	}
	
	public void setAeropuertoOrigen(Aeropuerto aeropuertoOrigen) {
		this.aeropuertoOrigen = aeropuertoOrigen;
	}

	public Date getHoraSalida() {
		return horaSalida;
	}

	public void setHoraSalida(Date horaSalida) {
		this.horaSalida = horaSalida;
	}

	public Date getHoraLlegada() {
		return horaLlegada;
	}

	public void setHoraLlegada(Date horaLlegada) {
		this.horaLlegada = horaLlegada;
	}

	public BigDecimal getPrecio() {
		return precio;
	}

	public void setPrecio(BigDecimal precio) {
		this.precio = precio;
	}

	public int getPlazas() {
		return plazas;
	}

	public void setPlazas(int plazas) {
		this.plazas = plazas;
	}

	public int getPlazasLibres() {
		return plazasLibres;
	}

	public void setPlazasLibres(int plazasLibres) {
		this.plazasLibres = plazasLibres;
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime
				* result
				+ ((aeropuertoDestino == null) ? 0 : aeropuertoDestino
						.hashCode());
		result = prime
				* result
				+ ((aeropuertoOrigen == null) ? 0 : aeropuertoOrigen.hashCode());
		result = prime * result
				+ ((horaSalida == null) ? 0 : horaSalida.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Vuelo other = (Vuelo) obj;
		if (aeropuertoDestino == null) {
			if (other.aeropuertoDestino != null)
				return false;
		} else if (!aeropuertoDestino.equals(other.aeropuertoDestino))
			return false;
		if (aeropuertoOrigen == null) {
			if (other.aeropuertoOrigen != null)
				return false;
		} else if (!aeropuertoOrigen.equals(other.aeropuertoOrigen))
			return false;
		if (horaSalida == null) {
			if (other.horaSalida != null)
				return false;
		} else if (!horaSalida.equals(other.horaSalida))
			return false;
		return true;
	}


	
}
